Flyweight Pattern: intro
#udemy
#Unity
Flyweight Pattern を実装するのは無駄(というか困難)
なぜなら、Unityが実質的にそのパターンを自動実装しているから
Flyweight Pattern の目的
すなわち、RAMの節約
Procedual Terrain Generation でRAM使用量を見る
Unityのメモリ使用量を見るために、たくさんのオブジェクトを作成してみる。
1. Cube の Prefab を作成
2. スクリプトを書く
code: NewWorld.cs
public class NewWorld : MonoBehaviour
{
public int width;
public int depth;
public GameObject cube;
void Start()
{
for (var x = 0; x < width; x++)
for (var z = 0; z < depth; z++)
{
Vector3 pos = new Vector3(
x,
Mathf.PerlinNoise(x * 0.2f, z * 0.2f) * 3,
z);
GameObject go = Instantiate(cube, pos, Quaternion.identity);
}
}
}
3. NewWorld という空オブジェクトを作成してアタッチ。
3. cube に Prefab を設定
4. 実行
Mathf.PerlinNoize()
デルタ値を設定することで、Randomよりもなだらかな乱数値を得られる。
自然なカーブ乱数は
地形生成や波形生成で便利
Technique: Align with View
1. ヒエラルキーでオブジェクトを選択
2. GameObject > Align with View
Scene Editor のカメラの位置に、ゲームオブジェクトのtransformを移動できる
メインカメラなどをコレで移動すると、みたい位置に調整しやすい
https://gyazo.com/7a08e43d487c687a1ae6209c4ddc5a3a
https://gyazo.com/4f9e142200d4e1de8456302e94fadff7
Profiler Window
パフォーマンスに関する情報を収集しているウィンドウ
上メニュー > Window > Analysis > Profiler
https://gyazo.com/a4040b7bab5969a4d2aaa5fde57deaba
https://gyazo.com/1fe3b8b8bd1818870998cfb9226be59e
わざとキューブごとにメッシュを生成してみる
Profiler の Mono の部分が実行中のゲームが食うメモリ
16MB -> 21MB くらいにはなるらしい (自分はならなかった)
Flyweightの本質
https://gyazo.com/2d1ef2b9d12f88dc2462e2f5862806bd
左が別々にメッシュを作った場合
右がPrefabを使いまわした場合
Flyweight パターン - Wikipedia
デザインパターン入門(Flyweight) - Qiita
同じようなインスタンスを別々の場所で使い回すときは、
1つのインスタンスを使いまわして省リソース化するほうが良いということ
シングルトンにも似た考え 
どう実装するか
Flyweightクラス
FlyweightFactoryクラス
Flyweightクラスのインスタンスがほしいときは、new Flyweightする代わりに
FlyweightFactoryのメソッドから取得するようにする。
FlyweightFactory.getFlyweight()
対称インスタンスが作成されていない時
作成してプールする。そして返す。
既に生成されていた時
プールから呼び出して返す。